package tech.siso.model;

import lombok.Data;

import java.math.BigDecimal;

@Data
public class QmsCalculateParam {

    /**
     * 电气系统的等值电阻值，Res=Zmax-Re
     */
    private Double res = 0d;
    /**
     * 阻抗峰的电阻值
     */
    private Double zmax = 0d;
    /**
     * 音圈的直流电阻
     */
    private Double re = 0d;
    /**
     * 振动质量
     * 是指扬声器在运动过程中参与振动各部件的质量总和,包括鼓纸部分,音圈,弹波以及参与振动的空气质量等.单位:克(gram).
     */
    private Double mms = 0d;
    /**
     * 力顺
     * 是指扬声器振动系统的支撑部件的柔顺度.其值越大,扬声器的整个振动系统越软.单位:毫米/牛顿(mm/n).
     */
    private Double cms = 0d;
    /**
     * 磁力
     * 间隙磁感应强度与有效音圈线长的乘积.单位:(t*m).
     */
    private Double bl = 0d;
    /**
     * 原始Qms
     * 测量Qms时，由REW之类软件计算的值，用于对比校验
     */
    private Double qmsOld = 0d;
    /**
     * 本次运算的Qms
     * 由本次参数运算的Qms，用于对比校验
     */
    private Double qms = 0d;

    //-----逻辑方法-----

    /**
     * 运算Qms的算法
     *
     * @return
     */
    public Double getQms() {
        if ((zmax != null && zmax > 0) && (re != null && re > 0)) {
            qms = (zmax - re) * Math.pow((mms / cms), 0.5) / Math.pow(bl, 2);
        } else if (res != null && res > 0) {
            qms = res * Math.pow((mms / cms), 0.5) / Math.pow(bl, 2);
        }
        return qms;
    }

    //-----其他数据-----

    /**
     * 误差百分比，%
     */
    public BigDecimal getDeviationPercentage() {
        if ((qmsOld != null && qmsOld > 0) && (qms != null && qms > 0)) {
            return (BigDecimal.valueOf(qms).subtract(BigDecimal.valueOf(qmsOld)))
                    .abs()
                    .divide(BigDecimal.valueOf(qms), 4, BigDecimal.ROUND_HALF_UP)
                    .multiply(BigDecimal.valueOf(100))
                    .setScale(2, BigDecimal.ROUND_HALF_UP);
        }
        return BigDecimal.ZERO;
    }


}
